"""配置文件加载模块"""
import json
import os
from pathlib import Path
from typing import Dict, Any
from .logger import get_logger

logger = get_logger()


class ConfigLoader:
    """配置文件加载器"""
    
    def __init__(self, config_path: str = None):
        """
        初始化配置加载器
        
        Args:
            config_path: 配置文件路径，默认为 config/config.json
        """
        if config_path is None:
            # 默认配置文件路径
            self.config_path = Path(__file__).parent.parent.parent / 'config' / 'config.json'
        else:
            self.config_path = Path(config_path)
        
        self.config: Dict[str, Any] = {}
    
    def load(self) -> Dict[str, Any]:
        """
        加载配置文件
        
        Returns:
            配置字典
        
        Raises:
            FileNotFoundError: 配置文件不存在
            json.JSONDecodeError: 配置文件格式错误
        """
        logger.info(f"正在加载配置文件：{self.config_path}")
        
        if not self.config_path.exists():
            logger.error(f"配置文件不存在：{self.config_path}")
            raise FileNotFoundError(f"配置文件不存在：{self.config_path}")
        
        try:
            with open(self.config_path, 'r', encoding='utf-8') as f:
                self.config = json.load(f)
            
            logger.info("配置文件加载成功")
            self._validate_config()
            return self.config
            
        except json.JSONDecodeError as e:
            logger.error(f"配置文件格式错误：{e}")
            raise
        except Exception as e:
            logger.error(f"加载配置文件时发生错误：{e}")
            raise
    
    def _validate_config(self):
        """验证配置文件的必要字段"""
        required_fields = {
            'user_info': ['name', 'student_id', 'class_name', 'phone'],
            'questionnaire': ['qr_code_path'],
            'schedule': ['start_time']
        }
        
        logger.info("正在验证配置文件...")
        
        for section, fields in required_fields.items():
            if section not in self.config:
                raise ValueError(f"配置文件缺少必要的节：{section}")
            
            for field in fields:
                if field not in self.config[section]:
                    raise ValueError(f"配置文件 [{section}] 节缺少必要的字段：{field}")
        
        logger.info("配置文件验证通过")
    
    def get(self, key: str, default: Any = None) -> Any:
        """
        获取配置值
        
        Args:
            key: 配置键，支持点号分隔的嵌套键（如 'user_info.name'）
            default: 默认值
        
        Returns:
            配置值
        """
        keys = key.split('.')
        value = self.config
        
        for k in keys:
            if isinstance(value, dict) and k in value:
                value = value[k]
            else:
                return default
        
        return value


def load_config(config_path: str = None) -> Dict[str, Any]:
    """
    快捷函数：加载配置文件
    
    Args:
        config_path: 配置文件路径
    
    Returns:
        配置字典
    """
    loader = ConfigLoader(config_path)
    return loader.load()

